﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Globalization;

namespace Clinica_Frba
{
    public partial class AltaAfiliadoForm : Form
    {
        Conexion sql = Conexion.getInstance();
        Utility util = Utility.getInstance();
        DateTime fechaActual;
        public bool modifica = false;
        bool changePass = false;
        char habilitado;
        int numeroAfiliado = 1;
        string numAfiliadoRaiz = "";
        string planMedicoInicial;
        bool cambiaPlanMedico = false;
        bool usValid = true;

        public AltaAfiliadoForm()
        {
            InitializeComponent();
        }

        private void AltaAfiliadoForm_Load(object sender, EventArgs e)
        {
            fechaActual = util.getAppDateTime();
            this.calendarioFechaNac.MaxSelectionCount = 1;
            calendarioFechaNac.TodayDate = fechaActual;
            try
            {
                SqlDataReader reader;
                reader = sql.execQuery("select Plan_Med_Codigo from b_sharp.PlanMedico;");
                
                
                while (reader.Read())
                {
                    this.PlanMedico.Items.Add(reader.GetDecimal(0));
                }
                reader.Close();

                if (modifica)
                {
                    this.Text = "Modificar Afiliado";
                    this.AceptarAfiliado.Enabled = false;
                    this.AceptarAfiliado.Visible = false;
                    this.Nombre.ReadOnly = true;
                    this.Apellido.ReadOnly = true;
                    this.NroDocumento.ReadOnly = true;
                    this.TipoDocumento.Enabled = false;
                    this.FechaNacimiento.ReadOnly = true;
                    this.botonParaCalendario.Visible = false;
                    this.Usuario.ReadOnly = true;
                    this.Contrasenia.Visible = false;
                    this.CantFamACargo.Visible = false;
                    this.CantFamACargo.Enabled = false;
                    this.label12.Visible = false;

                    planMedicoInicial = Convert.ToString(PlanMedico.SelectedItem);
                    PlanMedico.TextChanged += new EventHandler(PlanMedico_TextChanged);
                    modPass.Visible = true;
                    Modificar.Visible = true;

                    if (habilitado == 'N')
                    {
                        this.buttonHabilitar = new System.Windows.Forms.Button();
                        this.buttonHabilitar.Location = new System.Drawing.Point(465, 343);
                        this.buttonHabilitar.Name = "buttonHabilitar";
                        this.buttonHabilitar.Size = new System.Drawing.Size(101, 23);
                        this.buttonHabilitar.TabIndex = 37;
                        this.buttonHabilitar.Text = "Habilitar Afiliado";
                        this.buttonHabilitar.UseVisualStyleBackColor = true;
                        this.buttonHabilitar.Click += new EventHandler(buttonHabilitar_Click);
                        this.Controls.Add(this.buttonHabilitar);
                        this.buttonHabilitar.Show();
                    }
                }


            }
            catch (Exception)
            {
                MessageBox.Show("Error en la carga de datos. Intente nuevamente.");
                this.Close();
            }

            Usuario.TextChanged += new EventHandler(Usuario_TextChanged);
        }

        void Usuario_TextChanged(object sender, EventArgs e)
        {
            SqlDataReader reader;
            reader = sql.execQuery("select * from b_sharp.usuarios u  where u.id_usuario = '" + Usuario.Text + "';");
            if (reader.HasRows)
            {
                labelErrorUser2.Text = "Nombre de usuario ya existente";
                labelErrorUser2.Visible = true;
                usValid = false;
            }
            else
            {
                labelErrorUser2.Visible = false;
                usValid = true;

            }
        }

        void PlanMedico_TextChanged(object sender, EventArgs e)
        {
            if (Convert.ToString(PlanMedico.SelectedItem) != planMedicoInicial)
            {
                logPlanMedico.Visible = true;
                cambiaPlanMedico = true;
            }
        }


        private void botonParaCalendario_Click(object sender, EventArgs e)
        {
            this.calendarioFechaNac.Visible = true;
        }

        private void calendarioFechaNac_DateChanged(object sender, DateRangeEventArgs e)
        {
            DateTime fecha_elegida = this.calendarioFechaNac.SelectionRange.Start;
            this.FechaNacimiento.Text = fecha_elegida.ToString("dd/MM/yyyy");           
        }

       private void AceptarAfiliado_Click(object sender, EventArgs e)
       {
           if (validar() && usValid == true)
           {
               try
               {
                   SqlCommand insertarPacientes;
                   SqlCommand insertarUsuario;
                   SqlCommand insertarRol;
                   /*string nombreAfiliado = this.Nombre.Text;
                   string apellidoAfiliado = this.Apellido.Text;
                   string direccionAfiliado = this.Direccion.Text;
                   string mailAfiliado = this.Mail.Text;
                   string tipoDocumentoAfiliado = this.TipoDocumento.Text;
                   char sexoAfiliado = Convert.ToChar(this.Sexo.Text);
                   string estadoCivilAfiliado = this.EstadoCivil.Text;
                   DateTime fechaNacimientoAfiliado = Convert.ToDateTime(this.FechaNacimiento.Text);
                   int numDocumentoAfiliado = Convert.ToInt32(this.NroDocumento.Text);
                   decimal telefonoAfiliado = decimal(this.Telefono.Text);
                   int planMedicoAfiliado = Convert.ToInt32(this.PlanMedico.Text);
                   int cantFamCargoAfiliado = Convert.ToInt32(this.CantFamACargo.Value);*/
                   habilitado = 'S';
                   string usuario = this.Usuario.Text;
                   string password = util.sha256Encrypt(this.Contrasenia.Text);
                   int idAfiliado;

                   if (numeroAfiliado == 1)
                   {
                       numAfiliadoRaiz = getIdAfiliadoRaiz();
                   }
                   idAfiliado = Convert.ToInt32(numAfiliadoRaiz + '0' + numeroAfiliado);


                   insertarPacientes = new SqlCommand
                       ("INSERT INTO b_sharp.Pacientes VALUES(@id, @planMed, @nombre, @apellido, @numDoc, @tipoDoc, @sexo, @direccion, @telefono, @mail, @fecNac, @estCivil, @cFamCargo, @usuario, @habilitado);", sql.openCon());
                   insertarPacientes.Parameters.AddWithValue("@nombre", Nombre.Text);
                   insertarPacientes.Parameters.AddWithValue("@apellido", Apellido.Text);
                   insertarPacientes.Parameters.AddWithValue("@direccion", Direccion.Text);
                   insertarPacientes.Parameters.AddWithValue("@mail", Mail.Text);
                   insertarPacientes.Parameters.AddWithValue("@telefono", Convert.ToDecimal(Telefono.Text));
                   insertarPacientes.Parameters.AddWithValue("@tipoDoc", Convert.ToString(TipoDocumento.Text));
                   insertarPacientes.Parameters.AddWithValue("@sexo", Convert.ToString(Sexo.Text));
                   insertarPacientes.Parameters.AddWithValue("@estCivil", Convert.ToString(EstadoCivil.Text));
                   insertarPacientes.Parameters.AddWithValue("@fecNac", FechaNacimiento.Text);
                   insertarPacientes.Parameters.AddWithValue("@numDoc", Convert.ToDecimal(NroDocumento.Text));
                   insertarPacientes.Parameters.AddWithValue("@planMed", Convert.ToDecimal(PlanMedico.Text));
                   insertarPacientes.Parameters.AddWithValue("@cFamCargo", CantFamACargo.Value);
                   insertarPacientes.Parameters.AddWithValue("@habilitado", habilitado);
                   insertarPacientes.Parameters.AddWithValue("@usuario", Usuario.Text);
                   insertarPacientes.Parameters.AddWithValue("@id", idAfiliado);
                   insertarPacientes.ExecuteNonQuery();

                   insertarUsuario = new SqlCommand
                    ("INSERT INTO b_sharp.Usuarios VALUES(@usuario, @pass, @cantInt, 'N');", sql.openCon());
                   insertarUsuario.Parameters.AddWithValue("@usuario", usuario);
                   insertarUsuario.Parameters.AddWithValue("@pass", password);
                   insertarUsuario.Parameters.AddWithValue("@cantInt", 0);
                   insertarUsuario.ExecuteNonQuery();


                   insertarRol = new SqlCommand("INSERT INTO b_sharp.Rol_Usuario VALUES (@usuario, '1');", sql.openCon());
                   insertarRol.Parameters.AddWithValue("@usuario", usuario);
                   insertarRol.ExecuteNonQuery();

                   if ((this.CantFamACargo.Value > 0 || this.EstadoCivil.Text == "Casado/a") && numeroAfiliado == 1)
                   {
                       int k = 1;
                       if (this.EstadoCivil.Text == "Casado/a")
                       {
                           Decision nuevoAfiliado = new Decision();
                           nuevoAfiliado.label1.Text = "¿Agregar pareja?";
                           nuevoAfiliado.ShowDialog();
                           if (nuevoAfiliado.confirmar)
                           {
                               AltaAfiliadoForm nuevoAlta = new AltaAfiliadoForm();
                               nuevoAlta.CantFamACargo.Value = 0;
                               nuevoAlta.EstadoCivil.Text = "Casado/a";
                               nuevoAlta.EstadoCivil.Enabled = false;
                               nuevoAlta.label12.Text = "Cantidad de Hijos";
                               nuevoAlta.label12.Location = new Point(377,258);
                               nuevoAlta.numeroAfiliado = k + 1;
                               nuevoAlta.numAfiliadoRaiz = this.numAfiliadoRaiz;
                               nuevoAlta.ShowDialog();
                               k = 2;
                           }
                       }
                       else
                       {
                           k = 1;
                       }

                       if (this.CantFamACargo.Value > 0)
                       {
                           if (k == 1)
                           {
                               for (int i = k; i <= this.CantFamACargo.Value; i++)
                               {
                                   //bool activado = false;
                                   Decision agregarNuevoAfiliado = new Decision();
                                   agregarNuevoAfiliado.label1.Text = "¿Nuevo afiliado?";
                                   agregarNuevoAfiliado.ShowDialog();
                                   if (agregarNuevoAfiliado.confirmar)
                                   {
                                       AltaAfiliadoForm nuevaAlta = new AltaAfiliadoForm();
                                       nuevaAlta.CantFamACargo.Value = 0;
                                       nuevaAlta.CantFamACargo.Visible = false;
                                       nuevaAlta.label12.Visible = false;
                                       nuevaAlta.numeroAfiliado = i + 1;
                                       nuevaAlta.numAfiliadoRaiz = this.numAfiliadoRaiz;
                                       nuevaAlta.ShowDialog();
                                   }
                                   else
                                   {
                                       break;
                                   }
                               }
                           }
                           else //k == 2
                           {
                               for (int i = k; i <= this.CantFamACargo.Value + 1; i++)
                               {
                                   Decision agregarNuevoAfiliado = new Decision();
                                   agregarNuevoAfiliado.ShowDialog();
                                   if (agregarNuevoAfiliado.confirmar)
                                   {
                                       AltaAfiliadoForm nuevaAlta = new AltaAfiliadoForm();
                                       nuevaAlta.CantFamACargo.Value = 0;
                                       nuevaAlta.CantFamACargo.Visible = false;
                                       nuevaAlta.label12.Visible = false;
                                       nuevaAlta.numeroAfiliado = i + 1;
                                       nuevaAlta.numAfiliadoRaiz = this.numAfiliadoRaiz;
                                       nuevaAlta.ShowDialog();
                                   }
                                   else
                                   {
                                       break;
                                   }
                               }
                           } // termina el for
                       } //if de cantFamACargo
                   } // if general


                   MessageBox.Show("Usuario ingresado correctamente. "
                       + "Su numero de Afiliado es: " + idAfiliado);

                   this.Close();
               }
               catch
               {
                   MessageBox.Show("Error. Intente nuevamente");
               }
           }
           else
           {
               MessageBox.Show("Verifique los datos ingresados");
           }
           
       }


       public string getIdAfiliadoRaiz()
       {
           int idMaximo = 0;
           string idAfiliadoRaiz;

               SqlCommand query = new SqlCommand
                   ("select top 1 Id_Paciente from b_sharp.Pacientes order by Id_Paciente desc;", sql.openCon());

               idMaximo = ((Convert.ToInt32(query.ExecuteScalar())) / 100);


               idAfiliadoRaiz = Convert.ToString(idMaximo + 1);
               return idAfiliadoRaiz;

       }

       private void BorrarTodo_Click(object sender, EventArgs e)
       {
           CantFamACargo.Value = 0;
            foreach (Control control in this.Controls)
                {
                   if (((control.GetType().ToString() == "System.Windows.Forms.ComboBox") || (control.GetType().ToString() == "System.Windows.Forms.TextBox")) && (control.Enabled == true))
                   {
                       control.ResetText();
                   }
                }
          
       }



       private void Modificar_Click(object sender, EventArgs e)
       {
           SqlCommand modificarPacientes;
           SqlCommand modificarUsuario;

           if (validar())
           {
               try
               {
                   modificarPacientes = new SqlCommand
                       ("UPDATE b_sharp.Pacientes SET Paciente_Direccion = @direccion, Paciente_Mail = @mail, Paciente_Telefono = @telefono, Paciente_EstadoCivil = @estCivil, Plan_Med_Codigo = @planMed, Paciente_Sexo = @sexo, Habilitado = @habilitado where Id_Paciente = @id;", sql.openCon());
                   modificarPacientes.Parameters.AddWithValue("@direccion", Direccion.Text);
                   modificarPacientes.Parameters.AddWithValue("@mail", Mail.Text);
                   modificarPacientes.Parameters.AddWithValue("@telefono", Convert.ToDecimal(Telefono.Text));
                   modificarPacientes.Parameters.AddWithValue("@sexo", Convert.ToString(Sexo.Text));
                   modificarPacientes.Parameters.AddWithValue("@estCivil", Convert.ToString(EstadoCivil.Text));
                   modificarPacientes.Parameters.AddWithValue("@planMed", Convert.ToDecimal(PlanMedico.Text));
                   modificarPacientes.Parameters.AddWithValue("@habilitado", habilitado);
                   modificarPacientes.Parameters.AddWithValue("@id", IdAfiliadoTextBox.Text);
                   modificarPacientes.ExecuteNonQuery();


                   if (changePass)
                   {
                       string password = util.sha256Encrypt(this.Contrasenia.Text);
                       modificarUsuario = new SqlCommand
                        ("UPDATE b_sharp.usuarios SET contraseña = @pass where id_usuario = @usuario;", sql.openCon());
                       modificarUsuario.Parameters.AddWithValue("@usuario", Usuario.Text);
                       modificarUsuario.Parameters.AddWithValue("@pass", password);
                       modificarUsuario.ExecuteNonQuery();

                   }

                   if (cambiaPlanMedico)
                   {
                       SqlCommand modificarLogPlan = new SqlCommand
                        ("INSERT INTO b_sharp.LogPlanMedico (Cambio_Id_Paciente, Cambio_Plan_Med_Codigo_Viejo, Cambio_Plan_Med_Codigo_Nuevo, Cambio_Descripcion, Cambio_Fecha)" +
                        " VALUES (@idPaciente, @PlanViejo, @PlanNuevo, @Descr, @Fecha);", sql.openCon());
                       modificarLogPlan.Parameters.AddWithValue("@idPaciente", IdAfiliadoTextBox.Text);
                       modificarLogPlan.Parameters.AddWithValue("@PlanViejo", planMedicoInicial);
                       modificarLogPlan.Parameters.AddWithValue("@PlanNuevo", Convert.ToString(PlanMedico.Text));
                       modificarLogPlan.Parameters.AddWithValue("@Descr", logPlanMedico.Text);
                       modificarLogPlan.Parameters.AddWithValue("@Fecha", fechaActual);
                       modificarLogPlan.ExecuteNonQuery();
                   }


                   MessageBox.Show("Usuario modificado correctamente.");

                   this.Close();
               }
               catch
               {
                   MessageBox.Show("Verifique los datos ingresados");
               }
           }
           else
           {
               MessageBox.Show("Verifique los datos ingresados");
           }
       }

       public void asignarModificacion(string idModificar)
       {
           SqlDataReader reader;
           reader = sql.execQuery("select * from b_sharp.Pacientes p  where p.Id_Paciente = '" + idModificar + "';");

           this.IdAfiliadoTextBox.Text = idModificar;
           this.PlanMedico.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown;
           this.PlanMedico.Click += new EventHandler(PlanMedico_Click);

           while (reader.Read())
           {
               this.PlanMedico.Text = reader.GetDecimal(1).ToString();
               this.Nombre.Text = reader.GetString(2);
               this.Apellido.Text = reader.GetString(3);
               this.NroDocumento.Text = Convert.ToString(reader.GetDecimal(4));
               this.TipoDocumento.Text = reader.GetString(5);
               this.Sexo.Text = reader.GetString(6);
               this.Direccion.Text = reader.GetString(7);
               this.Telefono.Text = Convert.ToString(reader.GetDecimal(8));
               this.Mail.Text = reader.GetString(9);
               this.FechaNacimiento.Text = reader.GetDateTime(10).Date.ToString("d");
               this.EstadoCivil.Text = reader.GetString(11);
               //this.CantFamACargo.Value = reader.GetInt32(12);
               this.Usuario.Text = reader.GetString(13);
               habilitado = Convert.ToChar(reader.GetString(14));
           }

           
           reader.Close();
           
       }

       private void PlanMedico_Click(object sender, EventArgs e)
       {
           this.PlanMedico.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       }

       private void modPass_Click(object sender, EventArgs e)
       {
           changePass = true;
           this.Contrasenia.Visible = true;
           this.modPass.Visible = false;
           this.modPass.Enabled = false;
       }


       private void buttonHabilitar_Click(object sender, EventArgs e)
       {
           habilitado = 'S';
           this.buttonHabilitar.Enabled = false;
       }

       private void calendarioEnter(object sender, KeyPressEventArgs e)
       {
           if (e.KeyChar == Convert.ToChar(Keys.Enter))
           {
               this.calendarioFechaNac.Hide();
           }
           
       }

       private bool validar()
       {
           bool valido = true;
           decimal result;
           if (Nombre.TextLength < 1)
           {
               labelErrorNom.Visible = true;
               valido = false;
           }
           else
           {
               labelErrorNom.Visible = false;
           }
           if (Apellido.TextLength < 1)
           {
               labelErrorApe.Visible = true;
               valido = false;
           }
           else
           {
               labelErrorApe.Visible = false;
           }
           if (FechaNacimiento.TextLength < 1)
           {
               labelErrorFecNac.Visible = true;
               valido = false;
           }
           else
           {
               labelErrorFecNac.Visible = false;
           }
           if (NroDocumento.TextLength < 1 || !(decimal.TryParse((NroDocumento.Text), out result)))
           {
               labelErrorNumDoc.Visible = true;
               valido = false;
           }
           else
           {
               labelErrorNumDoc.Visible = false;
           }
           if (Telefono.TextLength < 1 || !(decimal.TryParse((Telefono.Text), out result)))
           {
               labelErrorTelefono.Visible = true;
               valido = false;
           }
           else
           {
               labelErrorTelefono.Visible = false;
           }
           if (PlanMedico.SelectedItem == PlanMedico.Items[0] || !(decimal.TryParse(PlanMedico.Text, out result)))
           {
               labelErrorPlanMedico.Visible = true;
               valido = false;
           }
           else
           {
               labelErrorPlanMedico.Visible = false;
           }
           if (Usuario.TextLength < 1)
           {
               labelErrorUser.Visible = true;
               valido = false;
           }
           else
           {
               labelErrorUser.Visible = false;
           }
           if (Contrasenia.TextLength < 1)
           {
               labelErrorPass.Visible = true;
               valido = false;
           }
           else
           {
               labelErrorPass.Visible = false;
           }
           return valido;
       }       


    }
}
